#include <stdio.h>
#include <string.h>
#include "algorithm.h"
#include "set.h"

#include "set.c++"
#include "hoistbp.c++"

char* key[11] =
{
  "Zero",
  "One",
  "Two",
  "Three",
  "Three",
  "Four",
  "Five",
  "Six",
  "Seven",
  "Eight",
  "Nine"
};

struct str_less
{
  str_less() {}

  bool operator()(char const* x, char const* y) const
    { return strcmp(x, y) < 0; }
};

void print_elem(char const* elem)
{
  printf("%s\n", elem);
}

int main()
{
  multiset<char*, str_less> test_multiset(key, key+11);

  for_each(test_multiset.begin(), test_multiset.end(), print_elem);
  printf("\n");

  for_each(test_multiset.rbegin(), test_multiset.rend(), print_elem);
  printf("\n");

  multiset_iterator<char*, str_less> j = test_multiset.end();

  print_elem(*--j);
  printf("\n");

  print_elem(*--j);
  printf("\n");

  print_elem(*--j);
  printf("\n");

  print_elem(*test_multiset.find("Three"));
  print_elem(*test_multiset.lower_bound("Three"));
  print_elem(*test_multiset.upper_bound("Three"));

  pair<multiset_iterator<char*, str_less>, multiset_iterator<char*, str_less> > range = test_multiset.equal_range("Three");
  for_each(range.first, range.second, print_elem);
  printf("\n");

  multiset<char*, str_less> s2(test_multiset);

  for_each(s2.begin(), s2.end(), print_elem);
  printf("\n");

  printf("test_multiset == s2 %i\n", test_multiset == s2);
  printf("\n");

  s2.erase("Zero");
  for_each(s2.begin(), s2.end(), print_elem);
  printf("\n");

  printf("test_multiset == s2 %i\n", test_multiset == s2);
  printf("\n");
};
